/**
 * 第一课，类型
 */
class types {
    // 定义从元数据，类型，其数据类型跟js中的数据类型基本上相同，同样具有数字，字符串，结构体，布尔值等，此外还提供了实用的枚举类型方便我们使用
    // 字符串类型与js中的一致，通过双引号或是单引号包含的字符串，还可以是用es6中的``模板字符串来表达，并且以${ expr }这种形式嵌入表达式
    name: string;
    // 数字number类型，其中还包括了浮点数据，字面量还支持的又十进制和十六进制以及ECMAScript 2015中引入的二进制和八进制字面量
    age: number;
    // 此处的数组是一个后端语言中说的泛型类似,
    habbys: Array<string>;//或者habbys:string[]这样定义数组
    // 元组Tuple允许表示一个已知元素数量和类型的数组
    stu: [string, number, boolean | number];//用来表示name，age，sex；注意在使用元组数据时，对应的数组中的类型一定要一致，实际上它也是一个数组，只不过数组里面的元素强制加上了数据类型而已
    // 对于不知道的数据类型，我们使用any来表示，它将允许你使用任何数据类型，在处理对象object时尤其有用
    salary: any;
    unusable: void = undefined || null; //void 类型的变量只能赋值为undefined或是null
    // null与undefined类型比较特殊，当然，null及undefined可以赋值给任何其他类型的一个初始值
    n: null = null;//null本身也是一种数据类型，与其JavaScript一样，但只能赋值为null
    u: undefined = undefined; //与null类似，也只能赋值为undefined
    // object表示非原始类型，也就是除number，string，boolean，symbol，null或undefined之外的类型
    peop: object | null;
    constructor(name: string) {
        // 枚举类型，作为JavaScript的数据类型的一种补充，使用枚举类型可以为一组数值赋予友好的名字
        // 与其他后端一样，默认情况下，从0开始为元素编号。 你也可以手动的指定成员的数值，如Red = 1;记住，枚举始终返回的是一个数字
        enum Color { Red = 1, Green, Blue = 4 };
        console.log(Color.Green == 2); // true
        // 枚举可以通过数值来查找对应的名字
        console.log(Color[1] == 'Red'); // true
        let someval = 'this is a string';
        let strlength = (<string>someval).length;//这种方式是被允许的。
        console.log(strlength);
        this.name = name;
    }
    sayName() {
        return this.name;
    }
    // 还有种类型void表明没有返回值，一般用于函数
    warnUser(): void {
        console.log("This is my warning message");
    }
    // never类型是任何类型的子类型，也可以赋值给任何类型；然而，没有类型是never的子类型或可以赋值给never类型（除了never本身之外）
    // 返回never的函数必须存在无法达到的终点
    error(msg: string): never {
        throw new Error(msg);
    }
    // 俗称死循环
    infiniteLoop(): never {
        while (true) {
        }
    }
}
export { types };
class type {
    // 定义字符串
    a: string = 'hello world';
    b: number;
    // boolean类型
    c: boolean = true;
    // 数组
    d: string[] = null;
    // 数组泛型
    d1: Array<number> = [1, 2, 3];
    // 空（只能赋值为null或是undefined）
    e: void = undefined;
    // null
    i: null = null;
    f: undefined = undefined;
    // 元组
    g: [string, number] = ['jack', 21];
    // 对象
    h: object = { age: 3 }
    constructor() {
        // 枚举
        enum Color { Red, White, Black }
    }
    // 出现死循环返回never类型或是无法达到终点
    infiniteLoop(): never {
        while (true) {
        }
    }
}